APP = {
	start:function(){
		
		Ext.QuickTips.init();
		Ext.Ajax.timeout = CONST.timeout;
		Ext.Ajax.extraParams = {application_version:SERVER.version};
		
		/*
		window.onbeforeunload = function(){
			return Ext.isGecko ? false : 
				"Czy na pewno chcesz opuścić tą stronę? - niezapisane zmiany zostaną utracone.";
		}*/
		
		APP.session.check();
		APP.utils.recountSizes();
		
	},
	createApp:function(){
		Ext.create('Ext.app.Application', {
			name: 'TS',
			autoCreateViewport: false,
			appFolder:URL.base+'/app',
			controllers: [
				'Dilema',
				'Bible',
				'General',
				'Movie',
				'BibleView'
			],
			launch: function(){
				APP.createViewport();
			}
		});
	},
	createViewport:function(){
				
		Ext.create('Ext.container.Viewport', {
			layout:'fit',
			autoDestroy:true,
            items: [{
            	xtype: 'tabpanel',
            	activeTab:null,
            	listeners:{
            		render:function(panel){
            			//panel.setActiveTab(0);
            		},
            		resize:function(){
            			APP.utils.recountSizes();
            		}
            	},
            	style:{
					backgroundColor:'#DFE8F6'
				},
            	items:[{
            		frame:true,
            		closable:true,
            		html:new Ext.XTemplate(HTML.userHello).apply({
						user_name:USER.user_firstname +' '+ USER.user_lastname,
						user_login:USER.login,
						role_name:USER.role_name,
						company:USER.company,
						message:USER.hello
					})
            	}]
            }],
			listeners:{
				render:function(){
					APP.session.loadingFinish();
					Ext.getBody().insertHtml('afterBegin',HTML.logout);
					
				},
				beforedestroy:function(){
					Ext.get('P_logout').remove();
				}
			}
        });
	},
	utils:{// TODO rethink gdzie wsadzić ()
		recountSizes:function(){
			CONST.width = {
				whole:Ext.isIE? document.body.clientWidth : window.innerWidth,
				half:Ext.isIE? Math.floor(document.body.clientWidth/2):Math.floor(window.innerWidth/2),
				third:Ext.isIE? Math.floor(document.body.clientWidth/3):Math.floor(window.innerWidth/3),
				sixth:Ext.isIE? Math.floor(document.body.clientWidth/6):Math.floor(window.innerWidth/6)
			}
			CONST.height = {
				whole:Ext.isIE? Math.floor(document.documentElement.offsetHeight-50):Math.floor(window.innerHeight-50),
				third:Ext.isIE? Math.floor((document.documentElement.offsetHeight-50)/3):Math.floor((window.innerHeight-50)/3),
				half:Ext.isIE? Math.floor((document.documentElement.offsetHeight-50)/2):Math.floor((window.innerHeight-50)/2)
			}
		}
		
	},
	session:{
		isAdmin:function(validate,role){
			var isAdmin = isIn(role || USER.acl_role_id,CONST.role.admin,CONST.role.devel);
			return validate ? Util.valid(!isAdmin,Ext.isString(validate)?validate:'Opcja administracyjna.') : isAdmin;
		},		
		login:function(btn,e){
			var f = btn.findParentByType('form').getForm();
			if (f.isValid()){
				f.submit({
					success:function(form,req){
						r = Ext.decode(req.response.responseText);
						if (r.success){
							//var prev_role = USER.acl_role_id;
							APP.session.check();
							//APP.afterLogin(prev_role);
						} else {// nigdy tu niewchodzi
							if(r.reason && r.reason == 'new_version') Factory.flyer.bad(r.msg);
							else Factory.flyer.bad('Błąd logowania');
						}
					},
					failure:function(form,req){
						r = Ext.decode(req.response.responseText);
						if (r.success){ 
							//var prev_role = USER.acl_role_id;
							//APP.afterLogin(prev_role);
						} else { // succes false zawsze tu trafia.
							if(r.reason && r.reason == 'new_version') Factory.flyer.bad(r.msg);
							else Factory.flyer.bad('Błąd logowania');
						}
					}
				});
			} else Factory.flyer.msg(HTML.msg.bad,'Wypełnij poprawnie formularz.');
		},
		logout: function(){
			Ext.Ajax.request({
				url: URL.util.logout,
				success: function(result,request){
					// TODO 
					// niektóre zakładki sie po ponownym wygwnerowaniu vieportu waliły - WHY??
					// - rozwikłac propblem i przywrócić : profil pracownika, administracja (inne ok :|) 
					window.onbeforeunload = Ext.emptyFn;
					location = location;
					
					//Util.cmp('viewport').removeAll();
					//Util.cmp('viewport').destroy();// załatwia srpawę.
						
					//APP.session.fail();
					//APP.helpers.clearAll();
					//if(x = Ext.getCmp('G_project'))x.getStore().removeAll();
				},
				failure: APP.session.fail
			});
		},
		check:function(){
			
			(Ext.get('loading') || Util.cmp('viewport'))|| 
				Ext.getBody().createChild({html:HTML.loadingMask});
			
			Ext.Ajax.request({
				url: URL.util.logged_info,
				//params:{content:'user'},
				success: function(result,request){
					var r = Ext.decode(result.responseText);
					if (!r.data || r.reason == 'auth_fail'){
						APP.session.loadingFinish();
						//USER.company = r.company;
						APP.session.fail();
					} else {
						if(r.data.version != SERVER.version){// po przelogowaniu bez przeładowania.
							alert('Wdrożono nową wersję aplikacji. Przeładuj stronę kożystając z klawisza F5.');
						} else {
							// tylko tu USERa
							USER = r.data;
							Util.close('login');
							
							//var start_viewport = function(){
								
								//(Ext.get('loading') || Ext.getCmp('Viewport'))|| 
									//Ext.getBody().createChild({html:HTML.loadingMask});
								
								USER.id=USER.user_id;
								//APP.onSessionOk();
								
								if(!Util.cmp('viewport')){
									APP.createApp();
								}
							//};
						
						}
					};
				},
				failure: APP.session.fail
			});
		},
		fail:function(a,b,success){
			if (!success){
				//log(TS,Util);
				Ext.create('TS.lib.LoginWindow');// TODO czy niema juz takiego okna?
			}
		},
		loadingFinish : function(){
		    var indi = Ext.get('loading');
		    var mask = Ext.get('loading-mask');
		    if(indi){
		    	var xy = indi.getXY();
		    	var width = indi.getWidth();
		    	var height = indi.getHeight();
		    }
		    if(mask){
			    mask.shift({
			        remove: true, duration: 1000, opacity: .1,
			        x:xy[0],y:xy[1],
					width: width, height: height,
			        easing: 'bounceOut',
			        callback: function(){
			        	if(indi)indi.fadeOut({
			                duration: 200,
			                remove: true
			            });
			        }
			    });
		    } else {
				indi && indi.remove();
		    }
		}
	}
}